package com.ruoyi.pack.service;

import java.util.List;
import java.math.BigDecimal;
import com.ruoyi.pack.domain.PackLocationLog;
import com.ruoyi.pack.domain.dto.CityTransitAnalysisDto;

/**
 * 定位日志Service接口
 * 
 * @author ruoyi
 * @date 2024-01-01
 */
public interface IPackLocationLogService 
{
    /**
     * 查询定位日志
     * 
     * @param logId 定位日志主键
     * @return 定位日志
     */
    public PackLocationLog selectPackLocationLogByLogId(Long logId);

    /**
     * 查询定位日志列表
     * 
     * @param packLocationLog 定位日志
     * @return 定位日志集合
     */
    public List<PackLocationLog> selectPackLocationLogList(PackLocationLog packLocationLog);

    /**
     * 查询定位日志列表（与运输计划表联表查询）
     * 
     * @param packLocationLog 定位日志
     * @return 定位日志集合（包含运输计划偏差信息）
     */
    public List<PackLocationLog> selectPackLocationLogListWithTransportPlan(PackLocationLog packLocationLog);

    /**
     * 新增定位日志
     * 
     * @param packLocationLog 定位日志
     * @return 结果
     */
    public int insertPackLocationLog(PackLocationLog packLocationLog);

    /**
     * 修改定位日志
     * 
     * @param packLocationLog 定位日志
     * @return 结果
     */
    public int updatePackLocationLog(PackLocationLog packLocationLog);

    /**
     * 批量删除定位日志
     * 
     * @param logIds 需要删除的定位日志主键集合
     * @return 结果
     */
    public int deletePackLocationLogByLogIds(Long[] logIds);

    /**
     * 删除定位日志信息
     * 
     * @param logId 定位日志主键
     * @return 结果
     */
    public int deletePackLocationLogByLogId(Long logId);
    
    /**
     * 根据定位器ID查询最新的定位日志
     * 
     * @param locatorId 定位器ID
     * @return 定位日志
     */
    public PackLocationLog selectLatestLogByLocatorId(Long locatorId);
    
    /**
     * 根据器具ID查询最新的定位日志
     * 
     * @param containerId 器具ID
     * @return 定位日志
     */
    public PackLocationLog selectLatestLogByContainerId(Long containerId);
    
    /**
     * 根据运单ID查询最近创建的定位日志
     * 
     * @param waybillId 运单ID
     * @return 定位日志
     */
    public PackLocationLog selectLatestLogByWaybillId(Long waybillId);

    /**
     * 根据运单ID查询倒数第二条定位日志（用于城市变化检测）
     * 
     * @param waybillId 运单ID
     * @param locatorId 定位器ID
     * @return 定位日志
     */
    public PackLocationLog selectSecondLatestLogByWaybillId(Long waybillId, Long locatorId);
    
    /**
     * 根据条件查询定位日志列表（高级筛选）
     * 
     * @param locatorCode 定位器编码
     * @param containerCode 器具编码
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param minBatteryLevel 最小电池电量
     * @param maxBatteryLevel 最大电池电量
     * @param minTemperature 最小温度
     * @param maxTemperature 最大温度
     * @param shockLevel 震动等级
     * @param uploadAddress 上传地址
     * @return 定位日志集合
     */
    public List<PackLocationLog> selectPackLocationLogByCondition(
        String locatorCode,
        String containerCode,
        String startTime,
        String endTime,
        Integer minBatteryLevel,
        Integer maxBatteryLevel,
        BigDecimal minTemperature,
        BigDecimal maxTemperature,
        Integer shockLevel,
        String uploadAddress
    );
    
    /**
     * 上传定位数据（设备接口）
     * 
     * @param packLocationLog 定位日志
     * @return 结果
     */
    public int uploadLocationData(PackLocationLog packLocationLog);
    
    /**
     * 分析从出发地到目的地的城市运输情况
     * 
     * @param departureCity 出发地城市名
     * @param destinationCity 目的地城市名
     * @return 城市运输分析结果
     */
    public CityTransitAnalysisDto analyzeCityTransit(String departureCity, String destinationCity);
} 